'''
面向对象，数据分析案例，主业务逻辑代码实现步骤
1. 设计一个类，可以完成数据的封装
2. 设计一个抽象类，定义文件读取的相关功能，并使用子类实现具体功价
3. 读取文件，生产数据对象
4. 进行数需求的逻辨计算《计算每一天的销售额)
5. 通过过PyEcharts进行图形绘制
'''

from file_define import FileReader, TextFileReader, JSONFileReader
from data_define import Record
# list分组导包
from itertools import groupby
# 引入可视化图表
import pyecharts.options
from pyecharts.charts import Pie


def countList(lst) -> int:
    print('abd', len(lst))
    sum_money = 0
    for item in lst:
        # print(type(item.money), type(sum_money))
        sum_money += int(item.money)
    return sum_money


if __name__ == '__main__':
    text_file_reader = TextFileReader('D:\\yfxdeve\\python\\pyProject\\python\\python入门\\数据分析\\demo1\\2011一月销售数据.txt')
    json_file_reader = JSONFileReader(
        'D:\\yfxdeve\\python\\pyProject\\python\\python入门\\数据分析\\demo1\\2011二月销售数据json.txt')
    textList = text_file_reader.read_data()
    jsonList = json_file_reader.read_data()

    # 将两份文件数据放到一起
    lst: list[Record] = textList + jsonList
    print(type(lst), len(lst))
    # 统计每个月的销售总金额, 注意：先排序，再分组
    # 先排序
    lst.sort(key=lambda x: x.date, reverse=False)
    # 再分组
    lst_group = groupby(lst, key=lambda x: x.date)
    print(type(lst_group))  # <class 'itertools.groupby'>

    # 定义字典记录每月统计值
    month_dict = {}

    for key, val in lst_group:
        # key_and_group = {key: list(val_list)}
        val_list = list(val)
        if key in month_dict.keys():
            print('key month_dict存在')
            sum_money = countList(val_list)
            month_dict[key] += sum_money
        else:
            print('key month_dict不存在', len(val_list))
            sum_money = countList(val_list)
            month_dict[key] = sum_money
            print(sum_money)
    print(month_dict)  # {'2011-01-01': 46, '2011-02-01': 10}


    # 生成饼图
    x_data =  month_dict.keys()
    y_data =  month_dict.values()
    pie = Pie()
    pie.add(
        series_name="访问来源",
        data_pair=[list(z) for z in zip(x_data, y_data)],
        radius=["50%", "70%"],
        label_opts=pyecharts.options.LabelOpts(is_show=False, position="center")
    )
    pie.set_global_opts(legend_opts=pyecharts.options.LegendOpts(pos_left="legft", orient="vertical"))
    pie.set_series_opts(
        tooltip_opts=pyecharts.options.TooltipOpts(
            trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
        ),
        # label_opts=opts.LabelOpts(formatter="{b}: {c}")
    )
    pie.render("doughnut_chart.html")
